package java;

import java.classe.Classe;
import java.classe.TokensSource;
import java.parametro.Parametro;
import java.util.ArrayList;



public class AssinaturaMetodo implements TokensSource {

	String metodo = null;

	String modificador = null;

	boolean abstracto = false;

	String retorno = null;

	ListaAssignException assinaturaExcessoes = null;

	private ListaAnotacao anotacoes = null;

	ListaParametros parametros = null;

	public AssinaturaMetodo(String metodo) {
		this.metodo = metodo;
	}

	public String codigoFonte() {
		String modificador = this.modificador == null ? NONVALUE
				: this.modificador + ESPACO;
		String retorno = this.retorno == null ? VOID : this.retorno;
		String anotacao = this.anotacoes == null ? NONVALUE : this.anotacoes
				.codigoFonte();
		String excessoes = this.assinaturaExcessoes == null ? NONVALUE
				: this.assinaturaExcessoes.codigoFonte();

		String abstracto = this.abstracto ? ABSTRACT + ESPACO : NONVALUE;

		return anotacao + modificador + abstracto + retorno + ESPACO
				+ this.metodo + INICIOPARENTECE + montarParametros()
				+ FIMPARENTECE + excessoes;
	}

	private String montarParametros() {
		return parametros == null ? NONVALUE : parametros.codigoFonte();
	}

	public void addParametro(Parametro parametro) {
		if (parametros == null)
			parametros = new ListaParametros();
		parametros.add(parametro);
	}

	public void addAnotacao(Anotar anotacao) {
		if (this.anotacoes == null)
			this.anotacoes = new ListaAnotacao();
		this.anotacoes.add(anotacao);
	}

	public void addExceptionAssign(Classe classe) {
		if (this.assinaturaExcessoes == null)
			this.assinaturaExcessoes = new ListaAssignException();
		this.assinaturaExcessoes.add(classe);
	}

	class ListaAssignException extends ArrayList<Classe> {
		private static final long serialVersionUID = 839299212464437340L;

		String codigoFonte() {
			String s = THROWS + ESPACO + get(0).getNome();
			for (int i = 1; i < size(); i++) {
				s += VIRGULA + ESPACO + get(i).getNome();
			}
			return s;
		}
	}

	private class ListaParametros extends ArrayList<Parametro> {
		private static final long serialVersionUID = 103030499249L;

		String codigoFonte() {
			String s = get(0).codigoFonte();
			for (int i = 1; i < size(); i++) {
				s += VIRGULA + ESPACO + get(i).codigoFonte();
			}
			return s;
		}
	}

	class ListaAnotacao extends ArrayList<Anotar> {
		private static final long serialVersionUID = 839199216464467540L;

		String codigoFonte() {
			String s = "";
			for (Anotar anotacao : this) {
				s +=  anotacao.codigoFonte();
			}
			return s;
		}
	}

	public void setAbstract(boolean abstracto) {
		this.abstracto = abstracto;

	}

	public void setRetorno(String retorno) {
		this.retorno = retorno;
	}
}
